package qiniu.voidcepc.voicepc.demos.web.utils;


import javax.sound.sampled.*;
import java.io.*;
  
/** 
 * 
 * 改变wav采样率 
 *-------------------- 
 * @author 赵海洋 
 * @date 2024-9-16 
 * @des 主要应用与ASR语音识别过程中，部分wav文件采样率与模型的不匹配，导致语音识别错误调整采样
 *率涉及到重新采样，即将音频数据按新的采样率进行插值或降采样。这可能涉及复杂的信号处理算法，
 * 通常可以使用现成的库来完成。例如，TarsosDSP库是一个常用的音频处理库，可以用于实现这种功能。
 * 
 * */ 
public class WavReSample { 
    
    /** 
     * 
     * @param newSampleRate 新的采样率 
     * @param inputFilePath 需要转化的文件 
     * @param outputFilePath  输出的文件路径 
     * 
     * */ 
    public static void reSampleRate(int newSampleRate,String inputFilePath,String outputFilePath) throws IOException, UnsupportedAudioFileException { 
        try (AudioInputStream inputAIS = AudioSystem.getAudioInputStream(new File(inputFilePath))) { 
            AudioFormat inputFormat = inputAIS.getFormat(); 
            AudioFormat outputFormat = new AudioFormat( 
                    AudioFormat.Encoding.PCM_SIGNED, 
                    newSampleRate, // New sample rate 
                    inputFormat.getSampleSizeInBits(), 
                    inputFormat.getChannels(), 
                    inputFormat.getFrameSize(), 
                    newSampleRate, // New sample rate 
                    inputFormat.isBigEndian() 
            ); 
            try (AudioInputStream outputAIS = AudioSystem.getAudioInputStream(outputFormat, inputAIS)) { 
                AudioSystem.write(outputAIS, AudioFileFormat.Type.WAVE,  new File(outputFilePath)); 
            } 
        } 
    }
    
    /**
     * 调整WAV文件采样率的便捷方法，返回处理后的文件路径
     * @param newSampleRate 新的采样率
     * @param inputFilePath 需要转换的文件路径
     * @return 处理后的文件路径
     * @throws IOException 文件操作异常
     * @throws UnsupportedAudioFileException 不支持的音频文件格式
     */
    public static String reSampleRate(int newSampleRate, String inputFilePath) throws IOException, UnsupportedAudioFileException {
        // 生成输出文件路径，在原文件名后添加采样率标识
        int lastDotIndex = inputFilePath.lastIndexOf('.');
        String outputFilePath;
        if (lastDotIndex > 0) {
            outputFilePath = inputFilePath.substring(0, lastDotIndex) + "_" + newSampleRate + ".wav";
        } else {
            outputFilePath = inputFilePath + "_" + newSampleRate + ".wav";
        }
        
        reSampleRate(newSampleRate, inputFilePath, outputFilePath);
        return outputFilePath;
    }
}